`timescale 1ns/1ps
// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// *********************************************************************************
// Project Name : 
// Author       : Dark
// Create Time  : 2023-01-13 19:30:09
// Revise Time	: 2023-01-13 19:30:09
// File Name    : defines.svh
// Abstract     : RV32I




//=================================================================================
// Arch config
//=================================================================================
`define PC_SIZE     32 
`define XLEN        32
`define REGBUS      32
`define ZEROWORD	32'd0
`define PC_BASEADDR 32'd0
//=================================================================================
// Memory config
//=================================================================================
//`define FPGA_SYN
`define DTCMDEEP    4096-1   // data mem 128kB
`define ITCMDEEP    4096-1   // instruction mem 128kB

//=================================================================================
// Decode config
//=================================================================================

// Instruction Type  opcode
`define OP_R         	   7'b0110011   
`define OP_LD        	   7'b0000011   
`define OP_I         	   7'b0010011   
`define OP_S         	   7'b0100011   
`define OP_B         	   7'b1100011   
`define OP_JAL       	   7'b1101111   
`define OP_JALR      	   7'b1100111   
`define OP_LUI       	   7'b0110111   
`define OP_AUIPC     	   7'b0010111   
// Instruction Type  func3

`define FUNC3_ADDI			3'b000
`define FUNC3_SLTI			3'b010
`define FUNC3_SLTIU			3'b011
`define FUNC3_XORI			3'b100
`define FUNC3_ORI			3'b110
`define FUNC3_ANDI			3'b111
`define FUNC3_SLLI			3'b001
`define FUNC3_SRI			3'b101 // SRAI SRLI


// ALU control signals   ==> alu_ctrl

`define ALU_ADD            4'b0000
`define ALU_SUB            4'b1000
`define ALU_SLL            4'b?001
`define ALU_SLT   	 	   4'b0010
`define ALU_SLTU  		   4'b0011
`define ALU_B              4'b1011
`define ALU_XOR            4'b?100
`define ALU_SRL            4'b0101
`define ALU_SRA            4'b1101
`define ALU_OR             4'b?110
`define ALU_AND            4'b?111

// Memory control signals   ==> mem_ctrl

`define MEM_SB  		  3'b000   
`define MEM_SH  		  3'b001   
`define MEM_SW  		  3'b010   

`define MEM_LB  		  3'b000   
`define MEM_LH  		  3'b001   
`define MEM_LW  		  3'b010   
`define MEM_LBU 		  3'b100   
`define MEM_LHU 		  3'b101   

//  extension immediate control signals ==> exi_ctrl
`define EXI_I	 		  3'b000
`define EXI_U	 		  3'b001
`define EXI_S	 		  3'b010
`define EXI_B	 		  3'b011
`define EXI_J	 		  3'b100

// Branch jump 
// Branch[3] 1 ==>uncondition
// Branch[3] 0 ==>  condition

`define BRAN_NOJ		  4'b1000  // order without jump
`define BRAN_JAL		  4'b1001
`define BRAN_JALR		  4'b1010
`define BRAN_BEQ		  4'b0000
`define BRAN_BNE		  4'b0001
//`define BRAN_BLT		  4'b01?0
`define BRAN_BLT		  4'b0100
`define BRAN_BLTU		  4'b0110
`define BRAN_BGE		  4'b0101
`define BRAN_BGEU		  4'b0111
// PC source  ==> PCAsrc PCBsrc
`define A_4BYTE		  	  1'b0
`define A_IMM			  1'b1
	  
`define B_PC			  1'b0
`define B_RS1			  1'b1

// write register source ==>  src_reg
`define SRC_ALU			  1'b0
`define SRC_MEM			  1'b1

// ALU source ==> alu_srcA,alu_srcB
`define A_RS1			  1'b0
`define A_PC			  1'b1
	  
`define B_RS2			  2'b00
`define B_IMM			  2'b01
`define B_4BYTE			  2'b10  // 4

`define FORWARD_ZERO      2'b00
`define FORWARD_ONE 	  2'b01
`define FORWARD_TWO 	  2'b10
//=================================================================================
// General config
//=================================================================================

`define Enable			  1'b1
`define Disable			  1'b0
